import axios from 'axios'
import { showToast } from 'vant';
import store from '@/store/index'



const isDev = process.env.NODE_ENV == 'development'
const request = axios.create({
  // baseURL: isDev ? '开发环境' : '生产环境'
  baseURL: isDev ? 'http://smart-shop.itheima.net/index.php?s=/api' : 'http://smart-shop.itheima.net/index.php?s=/api',
  // 配置请求的超时时间
  timeout: 60000,
})


// 添加请求拦截器
request.interceptors.request.use(function (config) {
  // 在发送请求之前做些什么
  // 多次数据请求是不合理的，使用节流方法，防止多次无效触发
  showLoadingToast({
    message: '加载中...',
    forbidClick: true,
    loadingType: 'spinner',
  });
  const token = store.getters.storeToken
  if (token) {
    config.headers['Access-Token'] = token
    config.headers.platform = 'APP'
  }

  return config;
}, function (error) {
  // 对请求错误做些什么
  return Promise.reject(error);
});

// 添加响应拦截器
request.interceptors.response.use(function (response) {
  // 2xx 范围内的状态码都会触发该函数。
  // 对响应数据做点什么
  const res = response.data
  // 如果不是正确的状态码，抛出错误，不执行其他的逻辑
  if (res.status !== 200) {
    showToast(res.message)

    // 抛出错误
    return Promise.reject(res.message)
  }


  closeToast()
  return response.data;
}, function (error) {
  // 超出 2xx 范围的状态码都会触发该函数。
  // 对响应错误做点什么
  return Promise.reject(error);
});


export default function ajax(config) {
  /*
      url：请求的地址
      method： 请求的方式
      data：请求的参数
      headers：请求头
  */
  const { url = '', method = 'get', data = {}, headers = {} } = config

  switch (method.toUpperCase()) {
    case 'GET':
      // get 请求规定参数配置的时候 { params: 要传递的参数 }
      return request.get(url, { params: data })
    case 'POST':

      // 判断 post 请求提交的是不是表单数据
      if (headers['content-type'] == 'application/x-www-form-urlencoded') {
        // 数据的序列化，格式化数据一次
        const obj = new URLSearchParams()
        for (const key in data) {
          obj.append(key, data[key])
        }
        return request.post(url, obj, { headers })
      }

      // 判断提交的内容是不是一个文件
      if (headers['content-type'] == 'multipart/form-data') {
        // 数据的序列化，格式化数据一次
        const obj = new FormData()
        for (const key in data) {
          obj.append(key, data[key])
        }
        return request.post(url, obj, { headers })
      }

      // json 数据的提交
      return request.post(url, data)

    case 'DELETE':
      // 用来删除数据用的
      return request.delete(url, { data })
    case 'PUT':
      // 用来更新数据用的
      return request.put(url, data)
    case 'PATCH':
      // 更新局部资源
      return request.patch(url, data)
    default:
      // 如果前面全部都不是
      return request.request(config)
  }

}
